package com.fary.beans.factory;

import com.fary.core.SpringException;
import com.fary.core.ResolvableType;

import java.lang.annotation.Annotation;
import java.util.Map;


/**
 * ListableBeanFactory是beanFactory接口的扩展接口，它可以枚举所有的bean实例，
 * 而不是客户端通过名称一个一个的查询得出所有的实例。要预加载所有的bean定义的beanfactory可以实现这个接口来。
 * 该 接口定义了访问容器中Bean基本信息的若干方法，如查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等方法.
 */
public interface ListableBeanFactory extends BeanFactory {

	/**
	 * 对于给定的名字是否含有BeanDefinition
	 */
	boolean containsBeanDefinition(String beanName);

	/**
	 * 返回工厂的BeanDefinition总数
	 */
	int getBeanDefinitionCount();

	/**
	 * 返回工厂中所有Bean的名字
	 */
	String[] getBeanDefinitionNames();

	/**
	 * 根据bean 的类型获取bean
	 *
	 *  这边的方法仅检查顶级bean.它不会检查嵌套的bean.FactoryBean创建的bean会匹配为FactoryBean而不是原始类型.
	 *  一样不会考虑父factory中的bean,非要用可以通过BeanFactoryUtils中的beanNamesForTypeIncludingAncestors.
	 *  其他方式注册的单例这边会纳入判断.
	 *  这个版本的getBeanNamesForType会匹配所有类型的bean,包括单例,原型,FactoryBean.返回的bean names会根据backend 配置的进行排序
	 */
	String[] getBeanNamesForType(ResolvableType type);

	/**
	 *
	 */
	String[] getBeanNamesForType(Class<?> type);

	/**
	 *
	 */
	String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);

	/**
	 *
	 */
	<T> Map<String, T> getBeansOfType(Class<T> type) throws SpringException;

	/**
	 *
	 */
	<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws SpringException;

	/**
	 *
	 */
	String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

	/**
	 *
	 */
	Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws SpringException;

	/**
	 *
	 */
	<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws SpringException;

}
